package com.ilxqx.framework.system.controller.base;

import org.springframework.data.domain.Page;

/**
 * 控制器钩子接口
 * @author venus
 */
public interface FrameworkController<T, ID, S, U> {

	/**
	 * 在获取单个实体之后触发
	 * @param entity 实体对象
	 * @return 处理后的对象
	 */
	default Object afterGet(T entity) {
		return entity;
	}

	/**
	 * 获取实体列表后触发
	 * @param entityPage 实体对象列表
	 * @return 处理后的对象
	 */
	default Object afterGetList(Page<T> entityPage) {
		return entityPage;
	}

	/**
	 * 在实体创建之前处理实体属性数据
	 * @param entity 实体对象
	 * @param form 表单对象
	 */
	default void beforeAdd(T entity, U form) {
	}

	/**
	 * 在实体修改之前处理实体属性数据
	 * @param entity 实体对象
	 * @param form 表单对象
	 */
	default void beforeModify(T entity, U form) {
	}

	/**
	 * 在实体创建之后的处理
	 * @param entity 更新后的实体对象
	 * @param form 表单对象
	 * @return 返回数据
	 */
	default Object afterAdd(T entity, U form) {
		return null;
	}

	/**
	 * 在实体修改之后的处理
	 * @param entity 修改后的实体对象
	 * @param form 表单对象
	 * @return 返回数据
	 */
	default Object afterModify(T entity, U form) {
		return null;
	}

	/**
	 * 删除之前做的检测操作
	 * @param entity 实体对象
	 */
	default void beforeDelete(T entity) {
	}

	/**
	 * 在实体删除之后的处理
	 * @param entity 删除完的实体对象
	 * @return 返回数据
	 */
	default Object afterDelete(T entity) {
		return null;
	}

	/**
	 * 是否自定义数据获取
	 * @return bool
	 */
	default boolean isCustomGetListData() {
		return false;
	}

	/**
	 * 自定义list数据获取
	 * @return 数据
	 */
	default Object customGetListData() {
		return null;
	}

	/**
	 * 复制属性时忽略的字段
	 * @return 忽略字段
	 */
	default String[] ignoredProperties() {
		return null;
	}

}
